/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package opera.InterfaceGrafica;


import opera.InterfaceGrafica.Controle.Cadastrar;
import opera.InterfaceGrafica.Controle.Alterar;
import opera.InterfaceGrafica.Controle.Deletar;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import opera.InterfaceGrafica.BarraDeMenu.BarraDeMenus;
import opera.InterfaceGrafica.PaineisCriarOuAbrirJogo.*;
import opera.InterfaceGrafica.PaineisDeAlteracao.*;
import opera.InterfaceGrafica.PaineisDeCadastro.*;
import opera.controle.ControleJogo;
import opera.exceção.*;
import opera.negocio.Jogo;

/**
 *
 * @author Luciano
 */
public class Teste extends JFrame implements ActionListener, MouseListener, MouseMotionListener{
    
    private static int indexTab;

    
    /**
     * @param args the command line arguments
     */
    
    //private static JPanel tabCadastrarFicha;
    private static PnlCadastrarFicha pnlCadastrarFicha;
    private static PnlCadastrarHabilidade pnlCadastrarHabilidade;
    private static PnlCadastrarCaracteristica pnlCadastrarCaracteristica;
    private static PnlCadastrarEquipamento pnlCadastrarEquipamento;
    private static PnlCadastrarDado pnlCadastrarDado;
    private static PnlCriarNovoJogo pnlCriarNovoJogo;
    private static PnlAbrirJogo pnlAbrirJogo;
    private static PnlDeletar pnlDeletar;
    
    private static PnlAlterarFicha pnlAlterarFicha;
    private static PnlAlterarHabilidade pnlAlterarHabilidade;
    private static PnlAlterarCaracteristica pnlAlterarCaracteristica;
    private static PnlAlterarEquipamento pnlAlterarEquipamento;
    
    
    private static Jogo jogo;

    private static Teste telaPrincipal;
    private static JTabbedPane tabbedPane;
        
    private BarraDeMenus barraDeMenus;
    private PopupFecharTab ppmFecharTab;
    private BarraDeFerramentas barraDeFerramentas;
    
    
    public Teste(){
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Opera RPG");
        
        
        
        
        //this.setLayout(new GridLayout(2, 1));
        
        //Tabbed Pane, para fazer separação das janelas
        tabbedPane = new JTabbedPane();
        
        barraDeMenus = new BarraDeMenus();
        barraDeFerramentas = new BarraDeFerramentas();
        barraDeFerramentas.setRollover(false);
        barraDeFerramentas.setEnabled(true);
        barraDeFerramentas.setFloatable(false);
        

        
        ppmFecharTab = new PopupFecharTab();
        ppmFecharTab.setFocusable(false);
        ppmFecharTab.setVisible(false);
        
        habilitarMenus(false);
        
        
        this.setJMenuBar(barraDeMenus);
        /*
        this.add(barraDeFerramentas);
        this.add(tabbedPane);
        */
        
        
        GroupLayout layout = new GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(barraDeFerramentas, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE)
                .addGap(0, 138, Short.MAX_VALUE))
            .addComponent(tabbedPane)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(barraDeFerramentas, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 248, Short.MAX_VALUE))
        );
            
        
        
        iniciarEventos();
    }
    
    //   Faz com que os menus da barra de menus fiquem disponiveis
    //ou indisponiveis (Menu Alterar, Menu Deletar)
    private void habilitarMenus(boolean habilitar){
        barraDeMenus.getMenuCadastrar().setEnabled(habilitar);
        barraDeMenus.getMenuAlterar().setEnabled(habilitar);
        barraDeMenus.getItemDeletar().setEnabled(habilitar);
        habilitarItensBarraDeFerramentas(habilitar);
    }
    //   Faz com que os itens da barra de ferramentas fiquem disponiveis
    //ou indisponiveis
    private void habilitarItensBarraDeFerramentas(boolean habilitar){
        barraDeFerramentas.getBtnDeletar().setEnabled(habilitar);
        barraDeFerramentas.getBtnNovaFicha().setEnabled(habilitar);
        barraDeFerramentas.getBtnNovaHabilidade().setEnabled(habilitar);
        barraDeFerramentas.getBtnNovaCaracteristica().setEnabled(habilitar);
        barraDeFerramentas.getBtnNovoEquipamento().setEnabled(habilitar);
        barraDeFerramentas.getBtnNovoDado().setEnabled(habilitar);
        barraDeFerramentas.getBtnAlterarFicha().setEnabled(habilitar);
        barraDeFerramentas.getBtnAlterarHabilidade().setEnabled(habilitar);
        barraDeFerramentas.getBtnAlterarCaracteristica().setEnabled(habilitar);
        barraDeFerramentas.getBtnAlterarEquipamento().setEnabled(habilitar);
    }
    
    //Faz com que os itens e botoes possam realizar eventos no método "actionPerformed()"
    private void iniciarEventos(){        
        barraDeMenus.getItemSair().addActionListener(this);
        barraDeMenus.getItemNovaFichaRPG().addActionListener(this);
        barraDeMenus.getItemNovaHabilidade().addActionListener(this);
        barraDeMenus.getItemNovaCaracteristica().addActionListener(this);
        barraDeMenus.getItemNovoEquipamento().addActionListener(this);
        barraDeMenus.getItemNovoDado().addActionListener(this);
        barraDeMenus.getItemAlterarFicha().addActionListener(this);
        barraDeMenus.getItemNovoJogo().addActionListener(this);
        barraDeMenus.getItemAbrirJogo().addActionListener(this);
        barraDeMenus.getItemDeletar().addActionListener(this);
        barraDeMenus.getItemAlterarHabilidade().addActionListener(this);
        barraDeMenus.getItemAlterarCaracteristica().addActionListener(this);
        barraDeMenus.getItemAlterarEquipamento().addActionListener(this);
        
        barraDeFerramentas.getBtnNovoJogo().addActionListener(this);
        barraDeFerramentas.getBtnAbrirJogo().addActionListener(this);
        barraDeFerramentas.getBtnDeletar().addActionListener(this);
        barraDeFerramentas.getBtnNovaFicha().addActionListener(this);
        barraDeFerramentas.getBtnNovaHabilidade().addActionListener(this);
        barraDeFerramentas.getBtnNovaCaracteristica().addActionListener(this);
        barraDeFerramentas.getBtnNovoEquipamento().addActionListener(this);
        barraDeFerramentas.getBtnNovoDado().addActionListener(this);
        barraDeFerramentas.getBtnAlterarFicha().addActionListener(this);
        barraDeFerramentas.getBtnAlterarHabilidade().addActionListener(this);
        barraDeFerramentas.getBtnAlterarCaracteristica().addActionListener(this);
        barraDeFerramentas.getBtnAlterarEquipamento().addActionListener(this);
        
        
       
        
        ppmFecharTab.getItemFechar().addActionListener(this);
        ppmFecharTab.getItemFecharTodos().addActionListener(this);
        ppmFecharTab.getItemFecharOutros().addActionListener(this);
        
        tabbedPane.addMouseListener(this);
        ppmFecharTab.addMouseListener(this);
        
        this.addMouseListener(this);
    }
    
    
    public static void main(String[] args) {
        // TODO code application logic here
        
        //Definindo o tipo de desenho da interface como "NIMBUS"
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("Windows".equals(info.getName())) {
                try {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
                }
                }
            }
        
        
        telaPrincipal = new Teste();
        telaPrincipal.setMinimumSize(new Dimension(820, 728));
        telaPrincipal.setMaximumSize(new Dimension(820, 728));
        telaPrincipal.setVisible(true);
    }
    
    

    @Override
    public void actionPerformed(ActionEvent event) {
        Object origem = event.getSource();
        
        if(origem.equals(barraDeFerramentas.getBtnNovoJogo())){
            //System.out.println(barraDeFerramentas.getBounds());
        }
        
        
        /**
         * Items do menuPOPUP Fechar das TABs
         */
        //Item Fechar
        if(origem.equals(ppmFecharTab.getItemFechar())){
            Object objeto = this.getTabbedPane().getComponentAt(indexTab);
            RemoverAba.getInstance().remover(telaPrincipal, (JPanel)objeto);
            ppmFecharTab.setVisible(false);
        }
        //Item Fechar Todos
        if(origem.equals(ppmFecharTab.getItemFecharTodos())){
            RemoverAba.getInstance().removerTodas(telaPrincipal);
            ppmFecharTab.setVisible(false);
        }
        //Item Fechar Outros
        if(origem.equals(ppmFecharTab.getItemFecharOutros())){
            Object objeto = this.getTabbedPane().getComponentAt(indexTab);
            RemoverAba.getInstance().removerOutras(telaPrincipal, (JPanel)objeto);
            ppmFecharTab.setVisible(false);
        }
        
        
        /**
         *    Itens do menu ARQUIVO ,Icones da barra de ferramentas 
         * correspondentes ao item no menu realizam a mesma funcao do item
         */
        //Item Novo Jogo, inicia um novo jogo de RPG
        if( (origem.equals(barraDeMenus.getItemNovoJogo())) || (origem.equals(barraDeFerramentas.getBtnNovoJogo())) ){
            CriarNovaAba.getInstance().abaCriarNovoJogo(telaPrincipal);
        }
        //Item Abrir Jogo, abre um jogo
        if( (origem.equals(barraDeMenus.getItemAbrirJogo())) || (origem.equals(barraDeFerramentas.getBtnAbrirJogo())) ){
            CriarNovaAba.getInstance().abaAbrirJogo(telaPrincipal);
        }
        //Item Deletar, abre uma tab para deletar o que o usuario escolher
        if( (origem.equals(barraDeMenus.getItemDeletar())) || (origem.equals(barraDeFerramentas.getBtnDeletar())) ){
            CriarNovaAba.getInstance().abaDeletar(telaPrincipal);
        }
        //Item Sair, fecha o programa
        if(origem.equals(barraDeMenus.getItemSair())){
            System.exit(0);
        }
        
        /**
         * Itens do menu ARQUIVO/NOVO ,Icones da barra de ferramentas 
         * correspondentes ao item no menu realizam a mesma funcao do item
         */
        //Item Nova Ficha de RPG abre a TAB para cadastrar uma nova ficha
        if( (origem.equals(barraDeMenus.getItemNovaFichaRPG())) || (origem.equals(barraDeFerramentas.getBtnNovaFicha())) ){
            CriarNovaAba.getInstance().abaCadastrarFicha(telaPrincipal);
        }
        //Item Nova Habilidade, abre a TAB para cadastrar uma nova habilidade
        if( (origem.equals(barraDeMenus.getItemNovaHabilidade())) || (origem.equals(barraDeFerramentas.getBtnNovaHabilidade())) ){
            CriarNovaAba.getInstance().abaCadastrarHabilidade(telaPrincipal);
        }
        //Item Nova Caracteristica, abre a TAB para cadastrar uma nova caracteristica
        if( (origem.equals(barraDeMenus.getItemNovaCaracteristica())) || (origem.equals(barraDeFerramentas.getBtnNovaCaracteristica())) ){
            CriarNovaAba.getInstance().abaCadastrarCaracteristica(telaPrincipal);
        }
        //Item Novo Equipamento, abre a TAB para cadastrar um novo equipamento
        if( (origem.equals(barraDeMenus.getItemNovoEquipamento())) || (origem.equals(barraDeFerramentas.getBtnNovoEquipamento())) ){
            CriarNovaAba.getInstance().abaCadastrarEquipamento(telaPrincipal);
        }
        //Item Novo Dado, abre a TAB para cadastrar um novo dado
        if( (origem.equals(barraDeMenus.getItemNovoDado())) || (origem.equals(barraDeFerramentas.getBtnNovoDado())) ){
            CriarNovaAba.getInstance().abaCadastrarDado(telaPrincipal);
        }
        
        /**
         * Itens do menu ALTERAR ,Icones da barra de ferramentas 
         * correspondentes ao item no menu realizam a mesma funcao do item
         */
        //Item Alterar Ficha, abre a TAB para alterar uma ficha
        if( (origem.equals(barraDeMenus.getItemAlterarFicha())) || (origem.equals(barraDeFerramentas.getBtnAlterarFicha())) ){
            CriarNovaAba.getInstance().abaAlterarFicha(telaPrincipal);
        }
        //Item Alterar Habilidade, abre a TAB para alterar uma Habilidade
        if( (origem.equals(barraDeMenus.getItemAlterarHabilidade())) || (origem.equals(barraDeFerramentas.getBtnAlterarHabilidade())) ){
            CriarNovaAba.getInstance().abaAlterarHabilidade(telaPrincipal);
        }
        //Item Alterar Caracteristica, abre a TAB para alterar uma caracteristica
        if( (origem.equals(barraDeMenus.getItemAlterarCaracteristica())) || (origem.equals(barraDeFerramentas.getBtnAlterarCaracteristica())) ){
            CriarNovaAba.getInstance().abaAlterarCaracteristica(telaPrincipal);
        }
        //Item Alterar Equipamento, abre a TAB para alterar um equipamento
        if( (origem.equals(barraDeMenus.getItemAlterarEquipamento())) || (origem.equals(barraDeFerramentas.getBtnAlterarEquipamento())) ){
            CriarNovaAba.getInstance().abaAlterarEquipamento(telaPrincipal);
        }
               
        
        
        /*
         * Botoes do painel CADASTRAR FICHA
         */
        //   Botao CADASTRAR da TAB Cadastrar Ficha, Cadastra a Ficha e depois fecha a aba
        if(pnlCadastrarFicha != null){
            if(origem.equals(pnlCadastrarFicha.getPnlCadastrarFichaParte02().getBtnCadastrar())){
                try {
                    Cadastrar.getInstance().cadastrarFicha(jogo, pnlCadastrarFicha);
                    String nome = pnlCadastrarFicha.getPnlCadastrarFichaParte01().getTxtNomePersonagem().getText();
                    RemoverAba.getInstance().remover(telaPrincipal, pnlCadastrarFicha);
                    CriarNovaAba.getInstance().abaCadastrarFicha(telaPrincipal);
                    JOptionPane.showMessageDialog(null,"Cadastro Ficha: " + nome +"\nRealizado com Sucesso!","Concluido",JOptionPane.INFORMATION_MESSAGE);
                } catch (FichaInvalidaException | IOException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        //   Botao CANCELAR e FECHAR da TAB Cadastrar Ficha, fecha ela mesma 
        if(pnlCadastrarFicha != null){
            if( (origem.equals(pnlCadastrarFicha.getPnlCadastrarFichaParte02().getBtnCancelar())) || (origem.equals(pnlCadastrarFicha.getBtnFechar().getBtnFechar())) ){
                RemoverAba.getInstance().remover(telaPrincipal, pnlCadastrarFicha);
            }
        }        
        
        /*
         * Botoes do painel CADASTRAR HABILIDADE
         */
        //   Botao CADASTRAR da TAB Cadastrar Habilidade, Cadastra a Habilidade e depois fecha a aba
        if(pnlCadastrarHabilidade != null){
            if(origem.equals(pnlCadastrarHabilidade.getBtnCadastrar())){
                try {
                    Cadastrar.getInstance().cadastrarHabilidade(jogo, pnlCadastrarHabilidade);
                    String nome = pnlCadastrarHabilidade.getTxtNome().getText();
                    RemoverAba.getInstance().remover(telaPrincipal, pnlCadastrarHabilidade);
                    CriarNovaAba.getInstance().abaCadastrarHabilidade(telaPrincipal);
                    JOptionPane.showMessageDialog(null,"Cadastro Habilidade: " + nome +"\nRealizado com Sucesso!","Concluido",JOptionPane.INFORMATION_MESSAGE);
                } catch (HabilidadeInvalidaException | IOException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        //   Botao CANCELAR e FECHAR da TAB Cadastrar Habilidade, fecha ela mesma
        if(pnlCadastrarHabilidade != null){
            if( (origem.equals(pnlCadastrarHabilidade.getBtnCancelar())) || (origem.equals(pnlCadastrarHabilidade.getBtnFechar().getBtnFechar())) ){               
                RemoverAba.getInstance().remover(telaPrincipal, pnlCadastrarHabilidade);
            }
        }
        
        /*
         * Botoes do painel CADASTRAR CARACTERISTICA
         */
        //   Botao CADASTRAR da TAB Cadastrar Caracteristica, Cadastra e depois fecha a aba
        if(pnlCadastrarCaracteristica != null){
            if(origem.equals(pnlCadastrarCaracteristica.getBtnCadastrar())){
                try {
                    Cadastrar.getInstance().cadastrarCaracteristica(jogo, pnlCadastrarCaracteristica);
                    String nome = pnlCadastrarCaracteristica.getTxtNome().getText();
                    RemoverAba.getInstance().remover(telaPrincipal, pnlCadastrarCaracteristica);
                    CriarNovaAba.getInstance().abaCadastrarCaracteristica(telaPrincipal);
                    JOptionPane.showMessageDialog(null,"Cadastro Caracteristica: " + nome +"\nRealizado com Sucesso!","Concluido",JOptionPane.INFORMATION_MESSAGE);
                } catch (CaracteristicaInvalidaException | IOException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        //   Botao CANCELAR e FECHAR da TAB Cadastrar Caracteristica, fecha ela mesma 
        if(pnlCadastrarCaracteristica != null){
            if( (origem.equals(pnlCadastrarCaracteristica.getBtnCancelar())) || (origem.equals(pnlCadastrarCaracteristica.getBtnFechar().getBtnFechar())) ){
                RemoverAba.getInstance().remover(telaPrincipal, pnlCadastrarCaracteristica);
            }
        }    
        
        /**
         * Botoes da TAB Cadastrar Equipamento
         */
        //   Botao CANCELAR e FECHAR de qualquer um dos paineis do "pnlCadastrarEquipamento"
        //fecha a TAB CADASTRAR EQUIPAMENTO
        if(pnlCadastrarEquipamento != null){
            if( (origem.equals(pnlCadastrarEquipamento.getPnlCadastrarEquipamento_Geral().getBtnCancelar())) ||(origem.equals(pnlCadastrarEquipamento.getPnlCadastrarEquipamento_Arma().getBtnCancelar())) || (origem.equals(pnlCadastrarEquipamento.getPnlCadastrarEquipamento_Armadura().getBtnCancelar())) || (origem.equals(pnlCadastrarEquipamento.getBtnFechar().getBtnFechar())) ){
                RemoverAba.getInstance().remover(telaPrincipal, pnlCadastrarEquipamento);
            }
        }
        
        /**
         * Botoes do painel CADASTRAR EQUIPAMENTO_GERAL, EQUIPAMENTO_ARMA e EQUIPAMENTO_ARMADURA
         */
        //   Botoes CADASTRAR da TAB Cadastrar Equipamento, cadastra e depois fecha a aba
        if(pnlCadastrarEquipamento != null){
            if( (origem.equals(pnlCadastrarEquipamento.getPnlCadastrarEquipamento_Arma().getBtnCadastrar())) || (origem .equals(pnlCadastrarEquipamento.getPnlCadastrarEquipamento_Armadura().getBtnCadastrar())) ){
                try {
                    Cadastrar.getInstance().cadastrarEquipamento(jogo, pnlCadastrarEquipamento);
                    String nome = pnlCadastrarEquipamento.getPnlCadastrarEquipamento_Geral().getTxtNome().getText(); 
                    RemoverAba.getInstance().remover(telaPrincipal, pnlCadastrarEquipamento);
                    CriarNovaAba.getInstance().abaCadastrarEquipamento(telaPrincipal);
                    JOptionPane.showMessageDialog(null,"Cadastro Equipamento: " + nome +"\nRealizado com Sucesso!","Concluido",JOptionPane.INFORMATION_MESSAGE);
                } catch (EquipamentoInvalidoException | IOException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        
        /**
         * Botoes da TAB Cadastrar Dado
         */
        //  Botao CADASTRAR da TAB Cadastrar Dado, cadastra e depois fecha a TAB
        if(pnlCadastrarDado != null){
            if(origem.equals(pnlCadastrarDado.getBtnCadastrar())){
                try {
                    Cadastrar.getInstance().cadastrarDado(jogo,pnlCadastrarDado);
                    String nome = pnlCadastrarDado.getTxtLados().getText();
                    RemoverAba.getInstance().remover(telaPrincipal, pnlCadastrarDado);
                    CriarNovaAba.getInstance().abaCadastrarDado(telaPrincipal);
                    JOptionPane.showMessageDialog(null,"Cadastro Dado: " + nome +"\nRealizado com Sucesso!","Concluido",JOptionPane.INFORMATION_MESSAGE);
                } catch (DadoInvalidoException | IOException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        // Botao CANCELAR e FECHAR da TAB,feca a tab
        if(pnlCadastrarDado != null){
            if( (origem.equals(pnlCadastrarDado.getBtnCancelar())) || (origem.equals(pnlCadastrarDado.getBtnFechar().getBtnFechar())) ){
                RemoverAba.getInstance().remover(telaPrincipal, pnlCadastrarDado);
            }
        }
        
        /*
         * Botoes do painel CRIAR NOVO JOGO
         */
        //   Botao CRIAR da TAB Criar Novo Jogo, cadastra e fecha a tab
        if(pnlCriarNovoJogo != null){
            if(origem.equals(pnlCriarNovoJogo.getBtnCriar())){
                try {
                    Cadastrar.getInstance().cadastrarJogo(pnlCriarNovoJogo);
                    jogo = new Jogo(pnlCriarNovoJogo.getTxtNome().getText());
                    RemoverAba.getInstance().removerTodas(telaPrincipal);
                    telaPrincipal.setTitle("Opera RPG - " + jogo.getNome());
                    habilitarMenus(true);
                    JOptionPane.showMessageDialog(null,"Jogo: " + jogo.getNome() + "\nCriado com Sucesso!","Concluido",JOptionPane.INFORMATION_MESSAGE);
                } catch (CriacaoPastaInvalidaException | JogoInvalidoException | IOException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
                
            }
        }
        //   Botao CANCELAR e FECHAR da TAB Cadastrar Caracteristica, fecha ela mesma 
        if(pnlCriarNovoJogo != null){
            if( (origem.equals(pnlCriarNovoJogo.getBtnCancelar())) || (origem.equals(pnlCriarNovoJogo.getBtnFechar().getBtnFechar())) ){
                RemoverAba.getInstance().remover(telaPrincipal, pnlCriarNovoJogo);
            }
        }
        
        
        /*
         * Botoes do painel ABRIR JOGO
         */
        //   Botao ABRIR da TAB Abrir Jogo, abre um jogo e fecha a tab
        if(pnlAbrirJogo != null){
            if(origem.equals(pnlAbrirJogo.getBtnAbrir())){
                try {
                    String nome = pnlAbrirJogo.getCmbSelecionarJogo().getSelectedItem().toString();
                    jogo = new Jogo(ControleJogo.getInstance().abrirJogo(nome));
                    RemoverAba.getInstance().removerTodas(telaPrincipal);
                    telaPrincipal.setTitle("Opera RPG - " + jogo.getNome());
                    habilitarMenus(true);
                    JOptionPane.showMessageDialog(null,"Jogo: " + jogo.getNome() + "\nAberto com Sucesso!","Concluido",JOptionPane.INFORMATION_MESSAGE);
                } catch (CriacaoPastaInvalidaException | JogoInvalidoException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        // Botao CANCELAR e FECHAR da TAB Abrir Jogo, fecha a tab
        if(pnlAbrirJogo != null){
            if( (origem.equals(pnlAbrirJogo.getBtnCancelar())) || (origem.equals(pnlAbrirJogo.getBtnFechar().getBtnFechar())) ){
                RemoverAba.getInstance().remover(telaPrincipal, pnlAbrirJogo);
            }
        }
        
        /**
         * Botoes do painel DELETAR
         */
        //Botao Cancelar e Fechar, fecha a tab
        if(pnlDeletar != null){
            if( (origem.equals(pnlDeletar.getBtnCancelar())) || (origem.equals(pnlDeletar.getBtnFechar().getBtnFechar())) ){
                RemoverAba.getInstance().remover(telaPrincipal, pnlDeletar);
            }
        }
        //Caixa de Combinacao, seleciona o objeto a ser deletado
        if(pnlDeletar != null){
            if(origem.equals(pnlDeletar.getCmbSelecionar())){
                try {
                    pnlDeletar.selecionarObjeto();
                } catch (JogoInvalidoException | IOException | ClassNotFoundException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        //Botao Deletar, deleta o que foi selecionado e depois fecha a tab
        if(pnlDeletar != null){
            if(origem.equals(pnlDeletar.getBtnDeletar())){
                try {
                    String nome = pnlDeletar.getCmbSelecionar().getSelectedItem().toString();
                    Deletar.getInstance().deletar(jogo, pnlDeletar);
                    if(nome.equals(jogo.getNome())){
                        habilitarMenus(false);
                        RemoverAba.getInstance().removerTodas(telaPrincipal);
                    }else{
                        RemoverAba.getInstance().remover(telaPrincipal, pnlDeletar);
                        CriarNovaAba.getInstance().abaDeletar(telaPrincipal);
                    }
                    JOptionPane.showMessageDialog(null,"Deletar: " + nome + "\nDeletado com Sucesso!","Concluido",JOptionPane.INFORMATION_MESSAGE);
                } catch (IOException | DeletarInvalidoException | FichaInvalidaException | HabilidadeInvalidaException | CaracteristicaInvalidaException | EquipamentoInvalidoException | JogoInvalidoException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        
        
        /**
         * Botoes da TAB Alterar Ficha
         */
        //Botao Cancelar e Fechar, fecha a tab
        if(pnlAlterarFicha != null){
            if( (origem.equals(pnlAlterarFicha.getPnlCadastrarFichaParte02().getBtnCancelar())) || (origem.equals(pnlAlterarFicha.getBtnFechar().getBtnFechar())) ){
                RemoverAba.getInstance().remover(telaPrincipal, pnlAlterarFicha);
            }
        }
        //Caixa de Combinacao, seleciona o objeto a ser alterado
        if(pnlAlterarFicha != null){
            if(origem.equals(pnlAlterarFicha.getCmbSelecionar())){
                try {
                    if(pnlAlterarFicha.getCmbSelecionar().getSelectedItem().toString().length() > 0){
                        pnlAlterarFicha.limparCampos();
                        pnlAlterarFicha.preencherCampos();
                    }else{
                        pnlAlterarFicha.limparCampos();
                    }
                } catch (IOException | ClassNotFoundException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        //Botao Alterar, altera a Ficha selecionada e depois fecha a tab
        if(pnlAlterarFicha != null){
            if(origem.equals(pnlAlterarFicha.getBtnAlterar())){
                try {
                    Alterar.getInstance().alterarFicha(jogo, pnlAlterarFicha);
                    String nome = pnlAlterarFicha.getFicha().getPersonagem();
                    RemoverAba.getInstance().remover(telaPrincipal, pnlAlterarFicha);
                    CriarNovaAba.getInstance().abaAlterarFicha(telaPrincipal);
                    JOptionPane.showMessageDialog(null,"Alterar: " + nome + "\nAlterado com Sucesso!","Concluido",JOptionPane.INFORMATION_MESSAGE);
                } catch (FichaInvalidaException | IOException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        
        
        /**
         * Botoes da TAB Alterar Habilidade
         */
        //Botao Cancelar e Fechar, fecha a TAB
        if(pnlAlterarHabilidade != null){
            if( (origem.equals(pnlAlterarHabilidade.getPnlCadastrarHabilidade().getBtnCancelar())) || (origem.equals(pnlAlterarHabilidade.getBtnFechar().getBtnFechar())) ){
                RemoverAba.getInstance().remover(telaPrincipal, pnlAlterarHabilidade);
            }
        }
        //Caixa de Combinacao, seleciona o objeto a ser alterado
        if(pnlAlterarHabilidade != null){
            if(origem.equals(pnlAlterarHabilidade.getCmbSelecionar())){
                try {
                    if(pnlAlterarHabilidade.getCmbSelecionar().getSelectedItem().toString().length() > 0){
                        pnlAlterarHabilidade.limparCampos();
                        pnlAlterarHabilidade.preencherCampos();
                        pnlAlterarHabilidade.habilitarCampos(true);
                    }else{
                        pnlAlterarHabilidade.limparCampos();
                        pnlAlterarHabilidade.habilitarCampos(false);
                    }
                } catch (IOException | ClassNotFoundException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        //Botao Alterar, altera a Habilidade selecionada e depois fecha a tab
        if(pnlAlterarHabilidade != null){
            if(origem.equals(pnlAlterarHabilidade.getBtnAlterar())){
                try {
                    Alterar.getInstance().alterarHabilidade(jogo, pnlAlterarHabilidade);
                    String nome = pnlAlterarHabilidade.getHabilidade().getNome();
                    JOptionPane.showMessageDialog(null,"Alterar: " + nome + "\nAlterado com Sucesso!","Concluido",JOptionPane.INFORMATION_MESSAGE);
                    RemoverAba.getInstance().remover(telaPrincipal, pnlAlterarHabilidade);
                    CriarNovaAba.getInstance().abaAlterarHabilidade(telaPrincipal);
                } catch (HabilidadeInvalidaException | IOException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        
        
        /**
         * Botoes da TAB Alterar Caracteristica
         */
        //Botao Cancelar e Fechar, fecha a TAB
        if(pnlAlterarCaracteristica != null){
            if( (origem.equals(pnlAlterarCaracteristica.getPnlCadastrarCaracteristica().getBtnCancelar())) || (origem.equals(pnlAlterarCaracteristica.getBtnFechar().getBtnFechar())) ){
                RemoverAba.getInstance().remover(telaPrincipal, pnlAlterarCaracteristica);
            }
        }
        //Caixa de Combinacao, seleciona o objeto a ser alterado
        if(pnlAlterarCaracteristica != null){
            if(origem.equals(pnlAlterarCaracteristica.getCmbSelecionar())){
                try {        
                    if(pnlAlterarCaracteristica.getCmbSelecionar().getSelectedItem().toString().length() > 0){
                        pnlAlterarCaracteristica.limparCampos();
                        pnlAlterarCaracteristica.preencherCampos();
                        pnlAlterarCaracteristica.habilitarCampos(true);
                    }else{
                        pnlAlterarCaracteristica.limparCampos();
                        pnlAlterarCaracteristica.habilitarCampos(false);
                    }
                } catch (IOException | ClassNotFoundException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
                
            }
        }
        //Botao Alterar, altera a Caracteristica selecionada e depois fecha a tab
        if(pnlAlterarCaracteristica != null){
            if(origem.equals(pnlAlterarCaracteristica.getBtnAlterar())){
                try {
                    Alterar.getInstance().alterarCaracteristica(jogo, pnlAlterarCaracteristica);
                    String nome = pnlAlterarCaracteristica.getCaracteristica().getNome();
                    JOptionPane.showMessageDialog(null,"Alterar: " + nome + "\nAlterado com Sucesso!","Concluido",JOptionPane.INFORMATION_MESSAGE);
                    RemoverAba.getInstance().remover(telaPrincipal, pnlAlterarCaracteristica);
                    CriarNovaAba.getInstance().abaAlterarCaracteristica(telaPrincipal);
                } catch (CaracteristicaInvalidaException | IOException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        
        
        /**
         * Botoes da TAB Alterar Equipamento
         */
        //
        //Botao Cancelar e Fechar, fecha a TAB
        if(pnlAlterarEquipamento != null){
            if( (origem.equals(pnlAlterarEquipamento.getPnlCadastrarEquipamento_Armadura().getBtnCancelar())) || (origem.equals(pnlAlterarEquipamento.getBtnFechar().getBtnFechar())) ){
                RemoverAba.getInstance().remover(telaPrincipal, pnlAlterarEquipamento);
            }
        }
        //Caixa de Combinacao, seleciona o objeto a ser alterado
        if(pnlAlterarEquipamento != null){
            if(origem.equals(pnlAlterarEquipamento.getCmbSelecionar())){
                try{
                    if(pnlAlterarEquipamento.getCmbSelecionar().getSelectedItem().toString().length() > 0){
                        pnlAlterarEquipamento.limparCampos();
                        pnlAlterarEquipamento.habilitarCampos(true);
                        pnlAlterarEquipamento.preencherCampos();
                    }else{
                        pnlAlterarEquipamento.limparCampos();
                        pnlAlterarEquipamento.habilitarCampos(false);
                    }
                } 
                catch (IOException | ClassNotFoundException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }            
            }
        }
        //Botao Alterar, altera a Caracteristica selecionada e depois fecha a tab
        if(pnlAlterarEquipamento != null){
            if(origem.equals(pnlAlterarEquipamento.getBtnAlterar())){
                try {
                    Alterar.getInstance().alterarEquipamento(jogo, pnlAlterarEquipamento);
                    String nome = pnlAlterarEquipamento.getEquipamento().getNome();
                    JOptionPane.showMessageDialog(null,"Alterar: " + nome + "\nAlterado com Sucesso!","Concluido",JOptionPane.INFORMATION_MESSAGE);
                    RemoverAba.getInstance().remover(telaPrincipal, pnlAlterarEquipamento);
                    CriarNovaAba.getInstance().abaAlterarEquipamento(telaPrincipal);
                } catch (EquipamentoInvalidoException | IOException e) {
                    JOptionPane.showMessageDialog(null,"ERROR: " + e.getMessage(),"Erro",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        
        
        
        
        //throw new UnsupportedOperationException("Not supported yet.");
    }
    
    /**
     * Metodos para iniciar evento (botoes e etc) dos paineis
     */
    public void iniciarEventosPnlCadastrarFicha(){
        if(pnlCadastrarFicha != null){
            pnlCadastrarFicha.getPnlCadastrarFichaParte02().getBtnCancelar().addActionListener(this);
            pnlCadastrarFicha.getPnlCadastrarFichaParte02().getBtnCadastrar().addActionListener(this);
            pnlCadastrarFicha.getBtnFechar().getBtnFechar().addActionListener(this);
        }
    }
    public void iniciarEventosPnlCadastrarHabilidade(){
        if(pnlCadastrarHabilidade != null){
            pnlCadastrarHabilidade.getBtnCancelar().addActionListener(this);
            pnlCadastrarHabilidade.getBtnCadastrar().addActionListener(this);
            pnlCadastrarHabilidade.getBtnFechar().getBtnFechar().addActionListener(this);
        }
    }
    public void iniciarEventosPnlCadastrarCaracteristica(){
        if(pnlCadastrarCaracteristica != null){
            pnlCadastrarCaracteristica.getBtnCancelar().addActionListener(this);
            pnlCadastrarCaracteristica.getBtnCadastrar().addActionListener(this);
            pnlCadastrarCaracteristica.getBtnFechar().getBtnFechar().addActionListener(this);
        }
    }
    public void iniciarEventosPnlCadastrarEquipamento(){
        if(pnlCadastrarEquipamento != null){
            pnlCadastrarEquipamento.getPnlCadastrarEquipamento_Geral().getBtnCancelar().addActionListener(this);
            pnlCadastrarEquipamento.getPnlCadastrarEquipamento_Geral().getBtnCadastrar().addActionListener(this);
            
            pnlCadastrarEquipamento.getPnlCadastrarEquipamento_Arma().getBtnCancelar().addActionListener(this);
            pnlCadastrarEquipamento.getPnlCadastrarEquipamento_Arma().getBtnCadastrar().addActionListener(this);
            
            pnlCadastrarEquipamento.getPnlCadastrarEquipamento_Armadura().getBtnCancelar().addActionListener(this);
            pnlCadastrarEquipamento.getPnlCadastrarEquipamento_Armadura().getBtnCadastrar().addActionListener(this);
            
            pnlCadastrarEquipamento.getBtnFechar().getBtnFechar().addActionListener(this);
        }
    }
    public void iniciarEventosPnlCadastrarDado(){
        if(pnlCadastrarDado != null){
            pnlCadastrarDado.getBtnCancelar().addActionListener(this);
            pnlCadastrarDado.getBtnCadastrar().addActionListener(this);
            pnlCadastrarDado.getBtnFechar().getBtnFechar().addActionListener(this);
        }
    }
    public void iniciarEventosPnlCriarNovoJogo(){
        if(pnlCriarNovoJogo != null){
            pnlCriarNovoJogo.getBtnCancelar().addActionListener(this);
            pnlCriarNovoJogo.getBtnCriar().addActionListener(this);
            pnlCriarNovoJogo.getBtnFechar().getBtnFechar().addActionListener(this);
            pnlCriarNovoJogo.addMouseListener(this);
        }
    }
    public void iniciarEventosPnlAbrirJogo(){
        if(pnlAbrirJogo != null){
            pnlAbrirJogo.getBtnCancelar().addActionListener(this);
            pnlAbrirJogo.getBtnAbrir().addActionListener(this);
            pnlAbrirJogo.getBtnFechar().getBtnFechar().addActionListener(this);
        }
    }
    public void iniciarEventosPnlDeletar(){
        if(pnlDeletar != null){
            pnlDeletar.getBtnCancelar().addActionListener(this);
            pnlDeletar.getBtnDeletar().addActionListener(this);
            pnlDeletar.getCmbSelecionar().addActionListener(this);
            pnlDeletar.getBtnFechar().getBtnFechar().addActionListener(this);
        }
    }
    public void iniciarEventosPnlAlterarFicha(){
        if(pnlAlterarFicha != null){
            pnlAlterarFicha.getPnlCadastrarFichaParte02().getBtnCancelar().addActionListener(this);
            pnlAlterarFicha.getCmbSelecionar().addActionListener(this);
            pnlAlterarFicha.getBtnAlterar().addActionListener(this);
            pnlAlterarFicha.getBtnFechar().getBtnFechar().addActionListener(this);
        }
    }
    public void iniciarEventosPnlAlterarHabilidade(){
        if(pnlAlterarHabilidade != null){
            pnlAlterarHabilidade.getBtnAlterar().addActionListener(this);
            pnlAlterarHabilidade.getPnlCadastrarHabilidade().getBtnCancelar().addActionListener(this);
            pnlAlterarHabilidade.getCmbSelecionar().addActionListener(this);
            pnlAlterarHabilidade.getBtnFechar().getBtnFechar().addActionListener(this);
        }
    }
    public void iniciarEventosPnlAlterarCaracteristica(){
        if(pnlAlterarCaracteristica != null){
            pnlAlterarCaracteristica.getBtnAlterar().addActionListener(this);
            pnlAlterarCaracteristica.getBtnFechar().getBtnFechar().addActionListener(this);
            pnlAlterarCaracteristica.getPnlCadastrarCaracteristica().getBtnCancelar().addActionListener(this);
            pnlAlterarCaracteristica.getCmbSelecionar().addActionListener(this);
        }
    }
    public void iniciarEventosPnlAlterarEquipamento(){
        if(pnlAlterarEquipamento != null){
            pnlAlterarEquipamento.getPnlCadastrarEquipamento_Armadura().getBtnCancelar().addActionListener(this);
            pnlAlterarEquipamento.getBtnFechar().getBtnFechar().addActionListener(this);
            pnlAlterarEquipamento.getCmbSelecionar().addActionListener(this);
            pnlAlterarEquipamento.getBtnAlterar().addActionListener(this);
        }
    }
    
    
    /**
     * Getters and Setters
     */
    public PnlCadastrarFicha getPnlCadastrarFicha(){
        return pnlCadastrarFicha;
    }
    public void setPnlCadastrarFicha(PnlCadastrarFicha painel){
        pnlCadastrarFicha = painel;
    }
    
    public PnlCadastrarHabilidade getPnlCadastrarHabilidade(){
        return pnlCadastrarHabilidade;
    }
    public void setPnlCadastrarHabilidade(PnlCadastrarHabilidade painel){
        pnlCadastrarHabilidade = painel;
    }
    
    public PnlCadastrarCaracteristica getPnlCadastrarCaracteristica(){
        return pnlCadastrarCaracteristica;
    }
    public void setPnlCadastrarCaracteristica(PnlCadastrarCaracteristica painel){
        pnlCadastrarCaracteristica = painel;
    }
    
    public PnlCadastrarEquipamento getPnlCadastrarEquipamento(){
        return pnlCadastrarEquipamento;
    }
    public void setPnlCadastrarEquipamento(PnlCadastrarEquipamento painel){
        pnlCadastrarEquipamento = painel;
    }
    
    public PnlCadastrarDado getPnlCadastrarDado(){
        return pnlCadastrarDado;
    }
    public void setPnlCadastrarDado(PnlCadastrarDado painel){
        pnlCadastrarDado = painel;
    }
    
    public PnlCriarNovoJogo getPnlCriarNovoJogo(){
        return pnlCriarNovoJogo;
    }
    public void setPnlCriarNovoJogo(PnlCriarNovoJogo painel){
        pnlCriarNovoJogo = painel;
    }
    
    public PnlAbrirJogo getPnlAbrirJogo(){
        return pnlAbrirJogo;
    }
    public void setPnlAbrirJogo(PnlAbrirJogo painel){
        pnlAbrirJogo = painel;
    }
    
    public PnlDeletar getPnlDeletar() {
        return pnlDeletar;
    }
    public void setPnlDeletar(PnlDeletar pnlDeletar) {
        Teste.pnlDeletar = pnlDeletar;
    }
    
    public PnlAlterarFicha getPnlAlterarFicha() {
        return pnlAlterarFicha;
    }
    public void setPnlAlterarFicha(PnlAlterarFicha pnlAlterarFicha) {
        Teste.pnlAlterarFicha = pnlAlterarFicha;
    }

    public PnlAlterarHabilidade getPnlAlterarHabilidade() {
        return pnlAlterarHabilidade;
    }
    public void setPnlAlterarHabilidade(PnlAlterarHabilidade pnlAlterarHabilidade) {
        Teste.pnlAlterarHabilidade = pnlAlterarHabilidade;
    }

    public PnlAlterarCaracteristica getPnlAlterarCaracteristica() {
        return pnlAlterarCaracteristica;
    }

    public void setPnlAlterarCaracteristica(PnlAlterarCaracteristica pnlAlterarCaracteristica) {
        Teste.pnlAlterarCaracteristica = pnlAlterarCaracteristica;
    }

    public PnlAlterarEquipamento getPnlAlterarEquipamento() {
        return pnlAlterarEquipamento;
    }

    public void setPnlAlterarEquipamento(PnlAlterarEquipamento pnlAlterarEquipamento) {
        Teste.pnlAlterarEquipamento = pnlAlterarEquipamento;
    }

    public BarraDeMenus getBarraDeMenus() {
        return barraDeMenus;
    }

    public void setBarraDeMenus(BarraDeMenus barraDeMenus) {
        this.barraDeMenus = barraDeMenus;
    }
    
    

    
    
    
    
    public Jogo getJogo() {
        return jogo;
    }
    public void setJogo(Jogo jogo) {
        Teste.jogo = jogo;
    }
    
    
    
    
    
    public JTabbedPane getTabbedPane(){
        return tabbedPane;
    }

    @Override
    public void mouseClicked(MouseEvent event) {
        Object origem = event.getSource();
        
        ppmFecharTab.setVisible(false);
        
        
        if(origem.equals(tabbedPane)){            
            if(event.getButton() == 3){
                Object objeto = tabbedPane.getComponentAt(event.getPoint());
                //System.out.println(objeto.getClass());
                //System.out.println(objeto.getClass().toString().equals("class javax.swing.plaf.basic.BasicTabbedPaneUI$TabContainer"));
                if(objeto.getClass().toString().equals("class javax.swing.plaf.basic.BasicTabbedPaneUI$TabContainer")){
                    //System.out.println("Deu Certo");
                    //System.out.println(event.getLocationOnScreen());
                    if(objeto instanceof JPanel){
                        
                        MoldePaineis painel = (MoldePaineis) tabbedPane.getSelectedComponent();
                        
                        //System.out.println(painel);
                        
                        indexTab = tabbedPane.indexOfTab(painel.getBtnFechar().getLblPalavra().getText());
                        
                        //System.out.println(indexTab);

                        ppmFecharTab.setLocation(event.getLocationOnScreen());
                        ppmFecharTab.setVisible(true);
                    }
                }
            }
        }
        
        
        
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mousePressed(MouseEvent event) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseReleased(MouseEvent event) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseEntered(MouseEvent event) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseExited(MouseEvent event) {
        Object origem = event.getSource();
        
        if(origem.equals(this)){
            ppmFecharTab.setVisible(false);
        }
        
        //throw new UnsupportedOperationException("Not supported yet.");
    }    

    @Override
    public void mouseDragged(MouseEvent event) {
        
        
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseMoved(MouseEvent event) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }
}


